[アップデート] ECS Fargate でも AWS FIS のネットワーク障害系のアクションがサポートされるようになった…はずだったのだが、そのままでは動かなかったので無理やり動かした

[アップデート] ECS Fargate でも AWS FIS のネットワーク障害系のアクションがサポートされるようになった…はずだったのだが、そのままでは動かなかったので無理やり動かした

Clock Icon2024.12.26

いわさです。

先週のアップデートになりますが、ECS Fargate で FIS のネックワーク障害系のアクションがサポートされました。

https://aws.amazon.com/about-aws/whats-new/2024/12/amazon-ecs-network-fault-injection-experiments-fargate/

これどういうことかというと、2023 年の 6 月に ECS と EKS でネックワーク障害(パケットロス、レイテンシ増加など)を含むいくつかのアクションが追加されています。
しかし、その時点では追加アクションのうちの次の 4 つに関しては Fargate では未サポートな状態でした。これが今回のアップデートでサポートされるようになりました。

  • aws:ecs:task-kill-process
  • aws:ecs:task-network-blackhole-port
  • aws:ecs:task-network-latency
  • aws:ecs:task-network-packet-loss

英語版ドキュメントでは既に上記制限事項について削除済みですが、日本語ドキュメントではまだ確認が可能です。

783373BF-E13F-46E4-853C-B0D76D5ACAD0.png

実現方法ですが、2023 年のアップデートと同じで、SSM エージェントのサイドカーコンテナを使って障害注入アクションを SSM Run Command で実行する形です。

C2E363A5-7E10-4F9C-9FA7-0F4451AEB045.png

引用元:https://docs.aws.amazon.com/fis/latest/userguide/ecs-task-actions.html

やってみたが...

細かい点は 1 年前のアップデートと同じなので割愛しますが、まず、適当な Web アプリのタスク定義に次のように SSM エージェントのサイドカーを追加します。
環境変数にマネージドロール名を指定するのを忘れないようにしましょう。

5C7B5C44-8331-4281-BA88-3E2A10071F7E_1_105_c.jpeg

また、タスク定義のインフラ設定で次のように「フォールトインジェクション」設定を有効化します。

6C004971-9493-46F5-85F3-AE3413D35881.png

他にもネットワークモードが bridge 以外とか pidMode が task であることなどいくつか条件があるのですが、Fargate かつ Linux の場合であれば特に気をつけなくてもその前提を満たすはずです。

この時点でタスクに割り当てられたパブリック IP アドレスにアクセスしてみると次のようにレスポンスを取得出来ます。0.05 秒くらいでしょうか。

% curl -w "code: %{http_code}, speed: %{time_total}\n" -o /dev/null -s http://13.231.103.127/
code: 200, speed: 0.055141
% curl -w "code: %{http_code}, speed: %{time_total}\n" -o /dev/null -s http://13.231.103.127/
code: 200, speed: 0.061231
% curl -w "code: %{http_code}, speed: %{time_total}\n" -o /dev/null -s http://13.231.103.127/
code: 200, speed: 0.053228

続いて FIS の実験テンプレートを作成します。今回はaws:ecs:task-network-latencyを発生させます。
実験テンプレート側で意識する点としては、アクション設定の一番下にある「Use ECS fault injection endpoints」を有効化することです(デフォルトは無効)

C876939E-027B-4C0F-9B09-EACDBD3878DF_1_105_c.jpeg

これ、設定しないとどうなるかというと、Fargat 用の SSM ドキュメントが選択されずに次のように「Fargate ではサポートされてませんよ」というエラーが発生します。

Unable to run the action task-network-latency due to denied capability.
Network actions are not supported for Fargate tasks.

D3CD49FD-E747-4642-8B3E-B708153DEA96.png

上記を有効化して SSM エージェントが正しく構成されていれば成功します。やってみましょう。

いけっ!

451A08EA-DA03-4DBE-9C79-C1AA20C7E37F.png

あれ...

SSM run document invocation with id c71ffce8-77d4-4d7f-b1b9-2ec6ae058895 has status FAILED.

Run Command の実行結果を確認してみましょう。確かに失敗しています。

6CC7792B-DA6B-4840-AEBE-EF8ADF326C97_1_105_c.jpeg

無理やり動かしてみた

この障害アクションですが、「AWSFIS-Run-Network-Latency-ECS」という SSM ドキュメントが実行されます。
ログから推察するにおそらく次の systemctl あたりで失敗しています。

DD813E27-3A6B-46DE-B7F7-6B48A6BCE2BC.png

コンテナイメージを変更してみたのですが私に力ではこのあたりを通すイメージを作成することは出来ませんでした。
ただ上記コマンドは依存パッケージのインストールフェーズでのみ行われているので、ここをスキップすればワンチャンあるかもしれない。

次のように実験テンプレート側で依存パッケージのインストールオプションを無効化してみました。
このオプションを無効化すると、SSM ドキュメント上のインストールステップが実行されず、もし必要パッケージがインストールされていない場合はエラーとなります。

早速試してみたのですが何度インストールしてみてもなぜかインストールされていないと判断されてしまっていました。

88CBAE38-1FDC-4F0F-8D5B-9ECEE24F8272.png

どうやらチェック部分のcommand -v curl-minimalが良く無さそうです。curlをチェックすべきなんじゃないだろうか。
ということで、FIS での実験テンプレート前に独自のドキュメントでインストールと curl-minimal のシンボリックリンクを作成しておきました。こんなやつです。

22E95D93-3D87-483B-8E7D-6396F5AFFBBA.png

上記実行後に実験を開始してみると...成功しました!

978A1EEE-5D22-412B-8C71-44A0E83CD212.png

上記 Running 中のレスポンスを確認してみると次のようにレイテンシが増加していることも確認出来ました。3,000ミリ秒増やしたつもりだったのですが、6,000ミリ秒増えていそう...。

% curl -w "code: %{http_code}, speed: %{time_total}\n" -o /dev/null -s http://13.231.103.127/
code: 200, speed: 6.059521
% curl -w "code: %{http_code}, speed: %{time_total}\n" -o /dev/null -s http://13.231.103.127/
code: 200, speed: 6.062007
% curl -w "code: %{http_code}, speed: %{time_total}\n" -o /dev/null -s http://13.231.103.127/
code: 200, speed: 6.053852

さいごに

本日は ECS Fargate でも AWS FIS のネットワーク障害系のアクションがサポートされるようになったので、試してみました。

無事(?)動かすことが出来ました。後半部分は無理やり動かすために実行した手順なので無視してください。
SSM ドキュメントで気になった点はフィードバックしておきたいと思います。すぐに問題なく動くように更新される気がします。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.